import {
  PrimaryGeneratedColumn,
  CreateDateColumn,
  UpdateDateColumn,
  DeleteDateColumn,
} from 'typeorm';

/**
 * 基础实体类
 * 所有实体都继承这个类，包含通用字段
 *
 * 为什么要有基础实体？
 * 1. 避免重复代码
 * 2. 统一字段命名
 * 3. 便于维护
 */
export abstract class BaseEntity {
  /**
   * 主键ID
   *
   * @PrimaryGeneratedColumn 装饰器说明：
   * - 'increment': 自增ID（MySQL 的 AUTO_INCREMENT）
   * - 'uuid': 使用 UUID（更安全，但查询稍慢）
   *
   * 为什么用 bigint？
   * - int 最大 21亿，用户量大了会不够用
   * - bigint 最大 9223372036854775807，足够用
   */
  @PrimaryGeneratedColumn('increment', { type: 'bigint' })
  id: string; // 注意：bigint 在 JS 中用 string 表示

  /**
   * 创建时间
   *
   * @CreateDateColumn 装饰器会自动设置创建时间
   * 插入记录时自动填充，不需要手动设置
   */
  @CreateDateColumn({
    type: 'timestamp',
    comment: '创建时间',
  })
  createdAt: Date;

  /**
   * 更新时间
   *
   * @UpdateDateColumn 装饰器会自动更新时间
   * 每次更新记录时自动更新，不需要手动设置
   */
  @UpdateDateColumn({
    type: 'timestamp',
    comment: '更新时间',
  })
  updatedAt: Date;

  /**
   * 软删除时间
   *
   * @DeleteDateColumn 实现软删除
   * - NULL 表示未删除
   * - 有值表示删除时间
   *
   * 为什么要软删除？
   * 1. 数据可恢复
   * 2. 保留历史记录
   * 3. 避免外键问题
   *
   * 软删除后：
   * - 查询时自动过滤已删除的记录
   * - 可以使用 withDeleted() 查询已删除记录
   * - 可以使用 restore() 恢复记录
   */
  @DeleteDateColumn({
    type: 'timestamp',
    nullable: true,
    comment: '删除时间（软删除）',
  })
  deletedAt?: Date;
}
